package com.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * InvocationHandler是JDK提供的反射类，用于在JDK动态代理中对目标方法进行增强
 * InvocationHandler实现类于切面类的环绕通知类似
 */
public class ProxyInvocationHandler implements InvocationHandler {

    /**
     * 目标对象
     */
    private Object target;

    public ProxyInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 在invoke方法中对目标对象方法进行增强
     *
     * @param proxy  代理对象
     * @param method 目标对象方法
     * @param args   目标对象方法参数
     * @return 目标对象方法运行后返回值
     * @throws Throwable 目标对象方法抛出的异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理方法执行" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date()));
        Object ret = method.invoke(target, args);
        return ret;
    }
}
